package com.ripcore.engine;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * RIP协议仿真配置类
 * 包含RIP协议运行所需的各种参数配置
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SimulationConfig {
    /**
     * 路由更新间隔时间（秒）
     * 默认值为30秒
     */
    private int updateIntervalSeconds = 30;
    
    /**
     * 路由超时时间（秒）
     * 超过此时间未收到更新的路由将被视为不可达
     * 默认值为180秒
     */
    private int routeTimeoutSeconds = 180;
    
    /**
     * 抑制时间（秒）
     * 在路由失效后，抑制该路由更新的时间
     * 默认值为180秒
     */
    private int holdDownSeconds = 180;
    
    /**
     * 最大度量值
     * RIP协议中表示路由不可达的度量值
     * 默认值为16
     */
    private int maxMetric = 16;

    /**
     * 水平分割模式枚举
     * NONE: 不启用水平分割
     * SPLIT_HORIZON: 启用水平分割
     * POISON_REVERSE: 启用毒性逆转
     */
    private SplitHorizonMode splitHorizonMode = SplitHorizonMode.POISON_REVERSE;
    
    /**
     * 是否启用触发更新
     * true表示启用，false表示禁用
     * 默认值为true
     */
    private boolean enableTriggeredUpdates = true;

    /**
     * 水平分割模式枚举类
     * 定义了RIP协议中可用的水平分割策略
     */
    public enum SplitHorizonMode {
        /**
         * 不启用水平分割
         */
        NONE,
        
        /**
         * 启用水平分割
         */
        SPLIT_HORIZON,
        
        /**
         * 启用毒性逆转
         */
        POISON_REVERSE
    }

    /**
     * 创建默认配置的工厂方法
     * @param updateIntervalSeconds 路由更新间隔时间（秒）
     * @param routeTimeoutSeconds 路由超时时间（秒）
     * @return 配置好的SimulationConfig实例
     */
    public static SimulationConfig defaultConfig(int updateIntervalSeconds, int routeTimeoutSeconds) {
        SimulationConfig c = new SimulationConfig();
        c.setUpdateIntervalSeconds(updateIntervalSeconds); // 设置路由更新间隔时间
        c.setRouteTimeoutSeconds(routeTimeoutSeconds); // 设置路由超时时间
        c.setHoldDownSeconds(180); // 设置抑制时间
        c.setMaxMetric(16); // 设置最大度量值
        c.setSplitHorizonMode(SplitHorizonMode.POISON_REVERSE); // 设置水平分割模式为毒性逆转
        c.setEnableTriggeredUpdates(true); // 启用触发更新
        return c;
    }
}